import Api, {fileUrlHost, imgHost, videoRelevantHost} from "@/utils/api";
import {getItem, setItem} from "@/utils/storage";
import {getRequest} from "@/utils/request";
import {
  GLOBAL_IS_LOGIN,
  GLOBAL_PREV_PAGE,
  GLOBAL_USER_ID,
  GLOBAL_OPEN_ID,
  GLOBAL_USER_INFO,
  GLOBAL_SYSTEM_INFO, GLOBAL_LOGIN_TIME
} from "@/utils/const";
import CryptoJS from "crypto-js";

/** 将一个对象先转为字符串 */
export function getStringWithParams(params) {
  let index = 0;
  let urlStr = '';
  for (let item in params) {
    if (index === 0) {
      urlStr += '?' + item + '=' + params[item]
    } else {
      urlStr += '&' + item + '=' + params[item]
    }
    index++
  }
  return urlStr;
}

/** 字符串判空 */
export function isEmpty(string) {
  let endString = String(string).trim();
  if (typeof endString === 'undefined' || endString === null || endString === 'null' || endString === '' || endString === 'undefined' || JSON.stringify(endString) === 'null') {
    return true;
  } else {
    return false;
  }
}

/** 手机号校验 */
export function isTelephone(telephone) {
  if (isEmpty(telephone)) {
    return false;
  }
  // 以1开头，11位
  let reg = /^(\+?0?86\-?)?1\d{10}$/;
  if (reg.test(telephone)) {
    return true
  } else {
    return false
  }
}

/** 密码格式校验 */
export function isPassword(password) {
  if (isEmpty(password)) {
    return false
  }
  // 8-20位数字和字母
  // let regexp = /^[0-9A-Za-z]{8,20}$/;
  // 8~20位同时包含数字和大小写字母
  let regexp = /(?![0-9A-Z]+$)(?![0-9a-z]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$/;
  return !regexp.test(password);
}

/** toast */
export function showToast(message) {
  uni.showToast({
    title: message,
    icon: 'none',
    duration: 2000,
    mask: false
  });
}

/** 密码格式校验 */
export function querySearchUrlKey(url, name) {
  let search, reg, value;
  if (url) {
    //获取问号后面的字符串
    search = url.substring(url.indexOf("?") + 1);
  }
  if (name) {
    //获取正则表达式
    reg = new RegExp("(^|&)" + name + "=([^&]*)($|&)");
    try {
      value = search.match(reg)[2];
    } catch (e) {
      value = null;
    }
  }
  return value;
}

/**
 * 判断用户是否已登录，未登录跳转到登录页，已登录跳转至对应页面
 * @param pathUrl 登录后要跳转的页面全路径
 * @param params 跳转页面需要传递的参数
 */
export function loginedJumpSpecifiedPage(pathUrl, params = {}) {
  console.log(getItem(GLOBAL_IS_LOGIN))
  if (getItem(GLOBAL_IS_LOGIN)) {
    uni.navigateTo({
      url: pathUrl + getStringWithParams(params)
    })
  } else {
    uni.navigateTo({
      url: '/pages/pkg-common/Login/index'
    })
  }
}

/**
 * 生成一个n位的随机id
 * @param {number|string} length 随机字符串的长度
 * @param {string} type
 */
export function generateRandomCode(length, type = 'numEML') {
  if (isNaN(parseInt(length)) || length <= 0) return;
  let selectData = {
    num: '0123456789',
    engM: 'abcdefghijklmnopqrstuvwxyz',
    engL: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
    numEM: '0123456789abcdefghijklmnopqrstuvwxyz',
    numEL: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
    engML: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
    numEML: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
  }
  const data = selectData[type];
  let len = data.length
  let codes = "";
  for (let i = 0; i < length; i++) {
    const r = parseInt(Math.random() * len);
    codes += data[r];
  }
  return codes;
}

/**
 * 补齐指定位数的数字,不足为补0
 * @param num 需要处理的数字
 * @param n 数字保留的位数
 * @returns {string} 处理后的数字
 */
export function prefixInteger(num, n) {
  return (Array(n).join(0) + num).slice(-n)
}

/**
 * 上传页面访问日志
 * @param {Object} routeRes 路由跳转记录对象
 * @param {Object} pageParams 手动埋点信息对象
 */
export function commonPageLog(routeRes, pageParams, allPageMsg) {
  if (!getItem(GLOBAL_OPEN_ID)) return;

  routeRes = routeRes || {};
  pageParams = pageParams || {};
  allPageMsg = allPageMsg || [];
  if ((!routeRes || !routeRes.path || allPageMsg.length < 1) && !pageParams) return
  let userInfo = getItem(GLOBAL_USER_INFO) || {}
  let prePage = getItem(GLOBAL_PREV_PAGE) || {};
  let pageEName = routeRes.path;//页面英文名存储页面路径
  let pageCName = "";//页面中文名
  let pageType = "";//页面类型，tab:tabBar页,loginIn:登录，page:页面。video:视频，article：文章
  for (let i = 0; i < allPageMsg.length; i++) {
    if (allPageMsg[i].path === pageEName) {
      pageCName = allPageMsg[i].name;
      pageType = allPageMsg[i].type;
      break;
    }
  }
  if (routeRes.query) {
    if (routeRes.query.title) {//文章类型
      pageCName = routeRes.query.title;
      pageType = "article";
    } else if (routeRes.query.videoId) {//视频类型
      pageCName = routeRes.query.videoName;
      pageType = "video";
    }
  }
  let stateTime = 0;
  if (prePage.leaveTmie) {
    stateTime = parseInt(((new Date().getTime() - parseInt(prePage.leaveTmie)) || 0) / 1000);
  }
  let logParams = {
    stateTime: stateTime || 0,//页面停留时长
    playBackRate: "",//视频完播率
    userNetType: "",//运营商名称
    cityCode: userInfo.deptId || "",//城市code
    cityName: userInfo.deptName || "",//城市名称
    moduleName: "",//项目名称，写死
    spId: "",//sp编号（无）
    spName: "",//sp名称（无）
    userId: getItem(GLOBAL_OPEN_ID) || "",//用户ID（传递openId）
    macId: "",//物理地址（无）
    stbId: getItem(GLOBAL_USER_ID) || "",//设备ID（午）
    apkVersion: "",//版本号（无）
    apkFromName: "",//小程序来源中文名称（无）
    fromInfo: "weChat",//来源信息（无）
    position: "",//获焦定位（无）
    focusLocation: "",//坑位信息（无）
    fromType: "",//当前内容类型
    fromCname: "",//当前内容对应的来源中文名
    fromEname: "",//当前内容对应的来源英文名
    fromId: "",//当前内容对应的来源id
    prevPageContentId: "",//上一级内容ID
    prevPageContentType: pageParams.prevPageContentType || prePage.prevPageContentType || "",//上一级内容类型
    prevPageEname: pageParams.prevPageEname || prePage.prevPageEname || "",//上一级内容英文名
    prevPageCname: pageParams.prevPageCname || prePage.prevPageCname || "",//上一级内容中文名
    contentId: "",//当前内容ID
    contentType: pageParams.contentType || pageType || "",//当前内容类型
    contentEname: pageParams.contentEname || pageEName || "",//当前内容英文名
    contentCname: pageParams.contentCname || pageCName || "",//当前内容中文名
    playId: "",//播放视频ID，
    playType: "",//视频播放类型，0:主动播放全屏播放，1被动播放
    eventType: "",//播放时间类型，start:开始，playing:播放中，end:结束
    playName: "",//播放视频中文名
    copyright: "",//视频版权方
    cpCname: "",//视频CP中文名
    prevPageUniqueId: "",//上一个内容包含视频归属于炫佳的唯一标识
    curPageUniqueId: "",//当前内容包含视频归属于炫佳的唯一标识
  }
  if (logParams.contentEname === logParams.prevPageEname) {
    return;
  }
  setItem(GLOBAL_PREV_PAGE, {
    prevPageContentType: logParams.contentType,
    prevPageEname: logParams.contentEname,
    prevPageCname: logParams.contentCname,
    leaveTmie: new Date().getTime()
  })
  getRequest(Api.SaveCommonLog, logParams)
    .then(res => {
    });
}

/**
 * 获取用户信息
 */
export function getUserInfo() {
  getRequest(Api.GetUserInfo + getItem(GLOBAL_USER_ID), {})
    .then(res => {
      if (!isEmpty(res)) {
        // 手机号加密
        const telStart = res.userPhone.slice(0, 3)
        const telEnd = res.userPhone.slice(7)
        res.userPhone = telStart + '****' + telEnd

        if (res.wechatPic !== null && !isEmpty(res.wechatPic.zipPath)) {
          if (res.wechatPic.zipPath.indexOf('https://') !== -1) {
            res.wechatPicPath = res.wechatPic.zipPath
          } else {
            res.wechatPicPath = fileUrlHost + res.wechatPic.zipPath
          }
        } else {

          if (res.wechatPicPath) {
            if (res.wechatPicPath.indexOf('/wechatProfilePic/') !== -1) {
              res.wechatPicPath = fileUrlHost + res.wechatPicPath
            }
          } else {
            res.wechatPicPath = imgHost + 'my-head.png'
          }
        }

        // 金豆数
        if (isEmpty(res.goldPrice)) {
          res.goldPrice = 0
        }

        // 存储用户信息
        setItem(GLOBAL_USER_ID, res.id)
        setItem(GLOBAL_USER_INFO, res)
      }
    })
}

/**
 * 生成签名sign
 * @param params 需要生成签名的参数
 * @returns {*}
 */
export function generateSign(params) {
  const secretKey = '9s91a9572i0806p6s5p4ar4s26684sis'
  params['nonce'] = generateRandomCode(12)
  params['timestamp'] = new Date().getTime()
  const content = JSON.stringify(params);
  console.log('加密内容: ', content)
  // 加密一：MD5加密
  const md5 = CryptoJS.MD5(content).toString(CryptoJS.enc.Hex);
  console.log('md5', md5);
  // 加密二：Base64加密
  const base64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(md5)).toString();
  console.log('base64: ', base64);
  // 加密三：加密值转大写
  const upperCase = base64.toUpperCase();
  console.log('大写: ', upperCase);
  // HMACSha256再次摘要
  const sign = CryptoJS.HmacSHA256(upperCase, secretKey).toString(CryptoJS.enc.Hex);
  console.log('sign: ', sign);
  return sign
}

/**
 * base64解码
 * @param base64Str 需要解码的字符串
 * @returns {*}
 */
export function base64Declassify(base64Str) {
  if (!base64Str) return
  const words = CryptoJS.enc.Base64.parse(base64Str);
  return CryptoJS.enc.Utf8.stringify(words);
}

// AES加密
const AESKEY = 'abcdefgabcdefg12';
const ivStr = '3db83091ce5bcc41';

/**
 * AES加密
 * @param word 需要加密的内容
 * @returns {string} AES加密后的内容
 */
export function encryptByAES(word) {
  let key = CryptoJS.enc.Utf8.parse(AESKEY);
  let encryptData = CryptoJS.AES.encrypt(word, key, {
    iv: CryptoJS.enc.Utf8.parse(ivStr),
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });

  return CryptoJS.enc.Base64.stringify(encryptData.ciphertext);
}

/**
 * AES解密
 * @param word 需要解密的内容
 * @returns {*} 解密后的明文0
 */
function decryptByAES(word) {
  let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
  let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
  let key = CryptoJS.enc.Utf8.parse(AESKEY);
  let decrypt = CryptoJS.AES.decrypt(srcs, key, {
    iv: CryptoJS.enc.Utf8.parse(ivStr),
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });

  let decryptedStr = decrypt.tostring(CryptoJS.enc.Utf8);
  return decryptedStr.tostring()
}

/**
 * 获取页面配置数据
 * @param pageEname 页面英文名称
 */
export function getPageConfigureData(pageEname) {
  const params = {
    ename: pageEname,
    status: 1,
    publishStatus: 1,
    terminalType: 4,
    themeId: 0,
    userId: '123456'
  }
  return getRequest(Api.PageWebList, params, '加载中...')
    .then(res => {
      if (res && res.length > 0) {
        const pageData = res[0]
        const pageComponent = pageData.pageComponents[0]
        return pageComponent.componentRooms
      }
    })
}

/**
 * 版本号比较（官网拷贝）
 * @param version1
 * @param version2
 * @returns {number} 1:version1 > version2；-1:version1 < version2；0:version1 = version2
 */
export function compareVersion(version1, version2) {
  version1 = version1.split('.')
  version2 = version2.split('.')
  const len = Math.max(version1.length, version2.length)

  while (version1.length < len) {
    version1.push('0')
  }
  while (version2.length < len) {
    version2.push('0')
  }

  for (let i = 0; i < len; i++) {
    const num1 = parseInt(version1[i])
    const num2 = parseInt(version2[i])

    if (num1 > num2) {
      return 1
    } else if (num1 < num2) {
      return -1
    }
  }
  return 0
}

/**
 * 在本平台系统下是否支持播放该视频
 * @param videoUrl 需要播放的视频地址
 * @returns {boolean} 是否可以播放
 */
export function isCanPlayVideo(videoUrl) {
  const systemInfo = getItem(GLOBAL_SYSTEM_INFO)
  const urlSuffix = videoUrl.substring(videoUrl.lastIndexOf(".") + 1)

  // iOS平台
  if (systemInfo.platform === 'ios') {
    // iOS系统可以播放视频格式
    const iosType = ['mp4', 'mov', 'm4v', '3gp', 'avi', 'm3u8']
    return iosType.includes(urlSuffix);
  }

  // 安卓平台
  if (systemInfo.platform === 'android') {
    // Android系统可以播放视频格式
    const androidType = ['mp4', '3gp', 'm3u8', 'webm']
    return androidType.includes(urlSuffix);
  }

  // windows、mac、devtools（开发者工具）
  if (systemInfo.platform === 'windows' || systemInfo.platform === 'mac' || systemInfo.platform === 'devtools') {
    // 其他平台可以播放视频格式
    const otherType = ['mp4', 'm3u8']
    return otherType.includes(urlSuffix);
  }

  return false
}

/**
 * 校验视频对象中的视频地址是否可以播放
 * @param videoObj  视频对象
 */
export function videoPlayerHandle(videoObj) {
  let videoPlayUrl = ''
  if (videoObj.playUrl) {
    if (isCanPlayVideo(videoObj.playUrl)) {
      videoPlayUrl = videoRelevantHost + videoObj.playUrl
    } else {
      showToast('当前视频格式无法预览，请至电脑端查看！')
      return false
    }
  } else if (videoObj.fileUrl) {
    if (isCanPlayVideo(videoObj.fileUrl)) {
      videoPlayUrl = videoRelevantHost + videoObj.fileUrl
    } else {
      showToast('当前视频格式无法预览，请至电脑端查看！')
      return false
    }
  } else {
    showToast('当前视频格式无法预览，请至电脑端查看！')
    return false
  }
  return videoPlayUrl
}

/**
 * 根据屏幕长度动态计算每一页应该是多少条数据才可以铺满整个屏幕
 * 里面的计算都是基于px单位计算的
 * @param itemHeight 每个item的最小高度（item默认传入的是rpx值）
 * @returns {number}  返回每页对应的条数
 */
export function computeCurrentPageCount(itemHeight) {
  // 获取系统信息
  const systemInfo = getItem(GLOBAL_SYSTEM_INFO);
  // 获取胶囊信息
  const menuBtnInfo = uni.getMenuButtonBoundingClientRect()
  const statusBarHeight = systemInfo.statusBarHeight
  const navBarHeight = menuBtnInfo.bottom + menuBtnInfo.top - statusBarHeight
  const screenHeight = systemInfo.screenHeight
  const contentHeight = screenHeight - navBarHeight
  return Math.trunc(contentHeight / (itemHeight / 2.0))
}

/**
 * 获取当前设备导航栏高度
 * @returns {*}
 */
export function getNavigationBarHeight() {
  // 获取系统信息
  const systemInfo = getItem(GLOBAL_SYSTEM_INFO);
  //获取胶囊信息
  const menuBtnInfo = uni.getMenuButtonBoundingClientRect()
  const statusBarHeight = systemInfo.statusBarHeight

  //计算组件高度
  const menuHeight = menuBtnInfo.height //胶囊高度
  const menuTop = menuBtnInfo.top //胶囊与顶部的距离
  //导航栏高度= （胶囊顶部距离-状态栏高度） x 2 + 胶囊的高度
  const navigatorHeight = (menuTop - statusBarHeight) * 2 + menuHeight
  //总高度 = 状态栏的高度 + 导航栏高度
  return (statusBarHeight + navigatorHeight) + 'px'
}

/**
 * 将数字转换成中文大写
 * @param num 需要转换的数字
 * @returns {string|string}
 */
export function numberToChineseCapital (num) {
  const changeNum = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'] // changeNum[0] = "零"
  const unit = ['', '十', '百', '千', '万']
  num = parseInt(num)
  const getWan = (temp) => {
    const strArr = temp.toString().split('').reverse()
    let newNum = ''
    for (let i = 0; i < strArr.length; i++) {
      newNum = (i === 0 && strArr[i] === 0 ? '' : (i > 0 && strArr[i] === 0 && strArr[i - 1] === 0 ? '' : changeNum[strArr[i]] + (strArr[i] === 0 ? unit[0] : unit[i]))) + newNum
    }
    return newNum
  }
  const overWan = Math.floor(num / 10000)
  let noWan = num % 10000
  if (noWan.toString().length < 4) noWan = '0' + noWan
  return overWan ? getWan(overWan) + '万' + getWan(noWan) : getWan(num)
}

/**
 * 获取新版本信息
 */
export function getNewVersionUpdateMessage() {
  console.log('版本更新！')
  const updateManager = uni.getUpdateManager();

  updateManager.onCheckForUpdate(function (res) {
    // 请求完新版本信息的回调
    console.log(res.hasUpdate);
  });

  updateManager.onUpdateReady(function (res) {
    uni.showModal({
      title: '更新提示',
      content: '新版本已经准备好，是否重启应用？',
      success(res) {
        if (res.confirm) {
          // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
          updateManager.applyUpdate();
        }
      }
    });
  });

  updateManager.onUpdateFailed(function (res) {
    // 新的版本下载失败
    console.log('新版本下载失败')
  });
}
